C++ 您所在的位置:网站首页 codeproject stdstring C++

C++

2024-07-12 03:47| 来源: 网络整理| 查看: 265

文章目录 1 C++ std::string字符串格式化1.1 C语言中的字符串格式化1.2 C++使用std::stringstream进行字符串格式化1.3 开源的C++单个头文件的字符串格式化工具1.3.1 format1.3.2 sformat 1.4 自定义的C++字符串格式化函数1.5 C++20的字符串标准库函数std::format

1 C++ std::string字符串格式化

在Python中,我们可以使用以下代码方便的格式化字符串

if __name__ == '__main__': format_str = "There are {} fools in the world".format(10) print(format_str)

不仅是Python,在其他高级语言中同样也可以很好地对字符串进行格式化。

本文将对C++中字符串格式化方法进行总结,包括:

C语言中如何进行字符串格式化C++20之前的版本如何进行字符串格式化C++20的字符串格式化标准库函数std::format 1.1 C语言中的字符串格式化

在C语言中,我们可以使用

int sprintf(char* buffer, const char* format, ... ); //不推荐使用 int snprintf(char* buffer, std::size_t buf_size, const char* format, ... );

进行字符串格式化,例如

#include int main() { char format_str[64] = { 0 }; snprintf(format_str, sizeof(format_str) - 1, "There are %d fools in the world", 10); std::cout class ArgBase { public: ArgBase() {} virtual ~ArgBase() {} virtual void Format(std::ostringstream &ss, const std::string& fmt) = 0; }; template class Arg : public ArgBase { public: Arg(T arg) : m_arg(arg) {} virtual ~Arg(){} virtual void Format(std::ostringstream &ss, const std::string& fmt) { ss } ~ArgArray() { std::for_each(begin(), end(), [](ArgBase* p){ delete p; }); } }; static void FormatItem(std::ostringstream& ss, const std::string& item, const ArgArray& args) { int index = 0; int alignment = 0; std::string fmt; char* endptr = nullptr; index = strtol(&item[0], &endptr, 10); if (index = args.size()) { return; } if (*endptr == ',') { alignment = strtol(endptr + 1, &endptr, 10); if (alignment > 0) { ss fmt = endptr + 1; } args[index]->Format(ss, fmt); return; } template static void Transfer(ArgArray& argArray, T t) { argArray.push_back(new Arg(t)); } template static void Transfer(ArgArray& argArray, T t, Args&&... args) { Transfer(argArray, t); Transfer(argArray, args...); } template std::string Format(const std::string& format, Args&&... args) { if (sizeof...(args) == 0) { return format; } ArgArray argArray; Transfer(argArray, args...); size_t start = 0; size_t pos = 0; std::ostringstream ss; while (true) { pos = format.find('{', start); if (pos == std::string::npos) { ss ss std::string format_str = SFormat("There are {0} fools in the world",10); std::cout auto size_buf = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; std::unique_ptr buf(new(std::nothrow) char[size_buf]); if (!buf) return std::wstring(""); std::snprintf(buf.get(), size_buf, format.c_str(), args ...); return std::wstring(buf.get(), buf.get() + size_buf - 1); }

使用方法

#include template static std::string str_format(const std::string& format, Args ... args) { auto size_buf = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; std::unique_ptr buf(new(std::nothrow) char[size_buf]); if (!buf) return std::string(""); std::snprintf(buf.get(), size_buf, format.c_str(), args ...); return std::string(buf.get(), buf.get() + size_buf - 1); } int main() { std::string format_str = str_format("There are %d fools in the world", 10); std::cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有